//
//  ViewController.m
//  Block的循环引用
//
//  Created by 伍银荣 on 2021/12/3.
//  Copyright © 2021 com.WYR. All rights reserved.
//

#import "ViewController.h"
#import "NetworkTools.h"

@interface ViewController ()
@property (nonatomic, strong) NetworkTools *tools;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //局部变量不会产生循环引用,全局变量会产生循环引用
   // NetworkTools *tools = [[NetworkTools alloc]init];
    self.tools = [[NetworkTools alloc]init];
    //定义block的时候,会对外部变量做一次 copy 操作,会对 self 进行一次强引用
    //解除循环引用,方法一:
    //__weak是 ios 5 推出的
    // 如果异步操作没有完成,释放控制器, __weak 本身是弱引用
    // 当异步线程执行完毕,进行回调, self 已经被释放了,无法访问属性,也无法调用方法
    // __weak 相当于 weak,不会做强引用,但是如果对象被释放了,执行的地址,会指向nil
    // __weak 更安全
    __weak typeof(self) weakSelf = self;
    
    //解除循环引用方法二:
    // __unsafe_unretained 是 iOS 4 推出的
    // MRC经典错误 EXC_BAD_ACCESS ,坏内存访问, 野指针
    // 相当于 assign, 不会做强引用,但是如果对象被释放,内存地址保持不变,如果此时再访问,就会出现野指针错误
   // __unsafe_unretained typeof(self) weakSelf = self;
    
    //这个方法没有作用
    // __strong 强引用,对 weakSelf 进行强引用,本意是希望在异步完成后,继续执行回调代码
    __strong typeof(self) strongSelf = weakSelf;
    [self.tools loadData:^(NSString * _Nonnull html) {
        NSLog(@"%@ - %@",html,weakSelf.view);
        }];
    
    
    
}

-(void)dealloc {
    NSLog(@"控制器 88 ");
}


@end
